linux静态库 动态库 去符号 符号恢复 | 您所在的位置:网站首页 › cold play主唱 章子怡 › linux静态库 动态库 去符号 符号恢复 |
前言
最近遇到了一题去除符号的题目,需要进行符号修复。为此学习了一波,顺便补了补其它的一下知识。 准备知识命名方式: 动态库libxxx.so.major.minor .so .dll 静态库:libxxx.a .a .lib生成动态库 gcc -shared -o libxxx.so.1.0 hello.o 生成静态库 ar cqs libxxx.a hello.o 用于设置动态库的路径 export LD_LIBRARY_PATH 用于设置静态库的路径 export LIBRARY_PATH ldd工具:查看依赖的动态库和静态库 nm工具:查看静态库和动态库中的函数名。T类当前库中定义的,U类表示是被调用的,W类表示可能被覆盖的 strip工具 可以去除程序的符号,缩小程序体积 在linux下gcc默认的编译选项就是动态库 ar -r 更新静态库 ar -d -v libxxx.a module.o 删除静态库中的某一模块 ar -t libxxx.a 列出静态库中包含的模块 ar -s 相当于ranlib,用于更新符号索引表 实验首先我自己写了个简单的hello程序 动态链接IDA下查看 使用strip 去除符号 静态链接 gcc -static t.c -o t使用nm查看时可以看到大量的输出。 ldd的输出 使用strip去除符号后同动态链接类似。 使用IDA打开… 恢复符号-FLIRT签名技术注意一下相关工具在ida的目录下,可以找到flirt.zip,解压出来即可 建议看一下flirt的readme.txt。 Typical scenario of a signature creation is: - run a parser and create pattern (PAT) files - run sigmake and get EXC file with collisions - edit EXC file and resolve collisions - run sigmake again and get SIG file - repeat the above 2 steps till collisions exist - run zipsig and get compressed SIG file注意一下不同环境下的库文件,用来生成PAT文件的工具时不同的,linux下使用pelf工具生成PTA plb.exe/plb——OMF库的解析器(Borland编译器常用) pcf.exe/pcf——COFF库的解析器(微软编译器常用) pelf.exe/pelf—— ELF库的解析器(许多Unix系统常用) ppsx.exe/ppsx—— 索尼PlayStation PSX的库解析器 ptmobj.exe/ptmobj——TriMedia库的解析器 pomf166.exe/pomf166——Kiel OMF 166对象文件的解析器我在尝试使用pelf生成pat时,一直报错,我认为是因为libc的版本原因。 随后我在晚上下载了一个低版本的libc.a文件,可以正常的生成pat文件。 接下来使用sigmake GCC.pat GCC.sig生成签名文件。 可以看到有13个冲突,要想成功的生成签名文件就必须解决冲突,同时我们还可以看到生成了.exc文件 查看内容如下图: 可以看到说明,由于某些函数的签名相同,因此sigmake需要你来决定该如何抉择。”+”代表应用该函数,”-“代表只在数据库中添加该函数的注释,不做处理代表你不想应用任何一个函数。 在解决冲突时需要注意以下几点: 1. 为最大限度地减少冲突,请删除排斥文件开头的四个注释行。 2. 最多只能给冲突函数组中的一函数附加+/-。 3. 如果一个冲突函数组仅包含一个函数,不要在该函数前附加+/-,让它保持原状即可。 4. sigmake连续运行失败会将包括注释行的数据附加到现有的任何排斥文件后。再次运行sigmake之前,必须删除这些附加数据,并更正原始数据(如果这些数据正确,sigmake将不会再次运行失败)。修改.exc文件后重新使用sigmake GCC.pat GCC.sig命令,如果不在报错,说明sig签名文件生成。 将签名文件拷贝到IDA的/sig/pc目录下(这个路径找了好久,网上很多教程说放在/sig目录下即可,但是7.0的ida需要放在/sig/pc目录下才能被正确识别,同时注意flair的版本同ida的版本要对应!) IDA中使用shift+F5,然后右键【Apply new signature…】窗口,选择生成的sig签名文件。 最终成功的匹配上了46个func,这是因为用来生成签名的libc.a版本太低了,而高版本的又生成不了签名文件。(我也不知道是不是因为版本的问题) 总结这篇文章只是基础的知识。linux就是需要多折腾! 参考文章https://blog.csdn.net/txx_683/article/details/53454426 http://drops.xmd5.com/static/drops/mobile-9797.html http://www.voidcn.com/article/p-gtapvefh-bat.html https://www.jianshu.com/p/2ec7ee43e3a1 |
CopyRight 2018-2019 实验室设备网 版权所有 |